#购物系统业务需求V1.0
"""购物车：shopping_trolley列表
   用户账户：money
   商品信息存储：products列表,用list存储，嵌套列表
   想要买的东西清单：wants列表
    """
#查看购物车信息
def show_cart(cart_list):
    print("****购物车信息如下:*****")
    for product in cart_list:
        print(product)
    print("************************")
#添加想要的商品到购物车(输入参数：待添加的商品good，现金余额money，商品列表products,购物车结算金额total)
def add_to_cart(good,money,products_list,cart_list,sum):
    iterated=[]
    #1.先查看商品列表中是否存在
    for product in products_list:
        #建立一个列表存储子列表第一个元素，即商品名称
        iterated.append(product[0])
    if good not in iterated:
        print(f"没有{good}这个商品！别瞎弄！\n")
    else:
        for product in products_list:
            if product[0]==good:
                money-=product[1]
                sum+=product[1]
                if money>=0:
                    cart_list.append(product)
                    print(f"恭喜，{product[0]}购买成功！已消费{sum}元，您的卡余额还剩{money}元\n");
                    break;
                elif money<0:
                    print("穷鬼，钱不够！请到其他超市购买!\n")
                    break;


    return money,sum;
#主函数
if __name__=="__main__":

    cart=[]#初始化一个空的购物车列表

    wants=['白醋','牛奶','洗发水','香蕉','鸡蛋','面包','苹果'];
    #存储商品信息,每个子列表分别存储['商品名称',单价,库存数量]
    products=[['白醋',8],['苹果',10],['牛奶',15],['面包',20],['鸡蛋',2],['洗发水',20],['酱油',10]]

    # 开始购物前显示购物车信息
    show_cart(cart);

    #逐个添加购物车
    ch = ''
    left = 100  # 初始化现金余额
    sum=0#初始化总计金额为0
    for want in wants:

        if ch=='Q' or ch=='q':
            print("已退出购物")
            break
        else:
            left,sum = add_to_cart(want, left, products, cart,sum)  # 添加的同时打印余额
            ch = input('输入Q/q退出购物:').strip().lower()


    #打印购物小条
    # 购物结束显示购物车信息
    show_cart(cart);
    print(f"总计消费:{sum}元")
    print(f"剩余余额:{left}元")


#二、购物系统业务需求V2.0
"""购物车：shopping_trolley列表
   用户账户：money
   商品信息存储：products列表,用list存储，嵌套列表
   想要买的东西清单：wants列表
    """
#查看购物车信息


def show_cart(cart_list,voucher_name,left_money,cart_sum):

    print("****您的购物信息如下:*****")
    print(f"抽中的商品优惠券：{voucher_name}")
    print("商品名称 商品单价 购买数量")
    for cart_item in cart_list:
        if cart_item[0]==voucher_name:
            print(f"备注：{voucher_name}八折优惠券X1")
        print("{0:<8}{1:<8}{2:<8}".format(cart_item[0],cart_item[1],cart_item[2]))
    current_time=datetime.now()
    print(f"您一共消费了{cart_sum}元,您的余额为{left_money}元")
    print(f"*******{current_time}*********")
    print("购物结束，欢迎您的光临！")
#添加退货功能、八折优惠券
#添加想要的商品到购物车(输入参数：待添加的商品good，现金余额money，商品列表products,购物车结算金额total)
def add_to_cart(good,left_money,products_list,cart_list,cart_sum,voucher_name):
    iterated=[]
    #1.先查看商品列表中是否存在,顺便查看一下库存信息
    for product in products_list:
        #建立一个列表存储子列表第一个元素，即商品名称
        # print(f"商品名称:{product[0]}商品单价:{product[1]}库存数量:{product[2]}")
        iterated.append(product[0])
    if good[0] not in iterated:
        print(f"没有{good}这个商品！别瞎弄！\n")
    else:
        for product in products_list:#逐个遍历货架中的商品信息，查找欲购买物品
            flag=0#设置一个优惠券有无标志，每次遍历一个商品时就重置为0
            if product[0]==good[0]:
                count = 0  # 统计每个物品的数量,每次统计一个物品时，就重置为0
                if voucher_name==good[0]:#如果优惠券是这个商品的，就令flag为1
                    flag=1
                    print(f"您有一张此商品（{voucher_name}）的优惠券可以使用")
                #product[0]：商品名称，product[1]：单价，product[2]：库存数量
                for i in range(good[1] ):  # 相同的商品一个一个购买，要考虑数量不够/钱不够的情况
                    if product[2] <= 0:
                        print(f"第{count+1}件{product[0]}购买失败，因为{product[0]}库存不足！请您到其他超市购买")
                        break
                    else:
                        #两种情况，跳出循环，除此之外，每次循环，都会使库存数量减一，现金减少，count+1
                        if i==1 and flag and left_money-product[1]*0.8<0:
                            print(f"穷鬼，钱不够！{product[0]}购买失败，请到其他超市购买!")
                            print(f"您的余额还剩{left_money}元")
                            break;
                        if flag!=1 and left_money-product[1]<0:
                            print(f"穷鬼，钱不够！第{count+1}件{product[0]}购买失败,请到其他超市购买!")
                            print(f"您的余额还剩{left_money}元")
                            break;

                        if i==1 and flag and left_money-product[1]*0.8>=0:#购买第一个且抽到的优惠券是此商品的
                            left_money-=product[1]*0.8
                            cart_sum+=product[1]*0.8
                            count += 1  # 购物车此物品数量累加
                            product[2] -= 1  # 更新此物品库存数量，减一
                            print(f"恭喜，您使用了一张{voucher}的优惠券，第{count}件{product[0]}添加购物车成功！");


                        if flag!=1 and left_money-product[1]>= 0:
                            left_money-=product[1]
                            cart_sum += product[1]
                            count += 1  # 购物车此物品数量累加
                            product[2] -= 1  # 更新此物品库存数量，减一
                            print(f"恭喜，第{count}件{product[0]}添加购物车成功！");



                        # if(product[2]<=0):
                        #     products_list.remove(product)#如果这一个商品数量小于0，就删除这个列表
                #设置一个列表cart_item,存储购买的信息[‘商品名称’,'购买数量']
                cart_item=[product[0],product[1],count] # 将购物车中单品的数量添加到列表中

                if count>0:
                    cart_list.append(cart_item)  # 此商品购买信息添加到购物车列表
                    print(f"恭喜，{product[0]}购买成功！"
                          f"购买数量：{count},单价：{product[1]},您已消费{cart_sum}元，您的卡余额还剩{left_money}元\n");
                else:
                    print(f"很遗憾，商品-{product[0]}购买失败!")
                    print(f"您的余额还剩{left_money}元")

    return left_money,cart_sum,cart_list,products_list;


#退货功能函数,交互式

def refund_product(left_money,cart_sum, products_list, cart_list, voucher_name):
    while True:#允许用户多次退货

        #显示购物车内容
        show_cart(cart_list,voucher_name,left_money,cart_sum)
        #用户选择要退货的商品和数量
        return_name=input("请输入要退货的商品名称(输入‘Q’或'q'退出退货操作)：").strip().lower()
        if return_name=='q':
            print("退出退货操作。")
            break
        return_num=int(input("请输入要退货的数量："))
        #检查商品是否在购物车中
        found=False

        #检查商品是否在购物车中
        for cart_item in cart_list:
            if cart_item[0]==return_name:
                found = True  # 找到商品
                refund_money = 0  # 初始化退货金额为0
                if return_num>cart_item[2]:
                    print(f"退货数量不能超过购物车的数量！购物车中{return_name}的数量为{cart_item[2]}。")
                    break

                #更新购物车数量
                cart_item[2]-=return_num

                #更新购物车总价和用户余额
                if cart_item[0]==voucher_name:#如果此商品使用率优惠券
                    if return_num==1:
                        left_money+=cart_item[1]*0.8
                        cart_sum-=cart_item[1]*0.8
                        refund_money=cart_item[1]*0.8
                    else:
                        left_money+=cart_item[1]*0.8+cart_item[1]*(return_num-1)
                        cart_sum-=cart_item[1]*0.8+cart_item[1]*(return_num-1)
                        refund_money=cart_item[1]*0.8+cart_item[1]*(return_num-1)
                else:#如果没有使用优惠券
                    left_money+=cart_item[1]*return_num
                    cart_sum-=cart_item[1]*return_num
                    refund_money=cart_item[1]*return_num
                #更新库存数量
                for product in products_list:
                    if product[0]==return_name:
                        product[2]+=return_num
                        break
                #如果退货后数量为0，从购物车中移除该商品
                if cart_item[2]==0:
                    cart_list.remove(cart_item)
                    print(f"商品{return_name}已从购物车中移除。")

                print(f"成功退货{return_num}件{return_name}，退货金额为{refund_money}元。")
                print(f"购物车总价为{cart_sum}元，账户余额为{left_money}元")
                break
        if not found:
            print(f"购物车中没有 {return_name}，无法退货。")

    return cart_sum,left_money,cart_list,products_list
def get_voucher(coupon_dict):

    voucher_id=random.randint(1,10)
    voucher_name=coupon_dict[voucher_id]
    return voucher_name
def show_products(products_list):
    print("以下是库存信息：")
    for product in products_list:
        print(f"商品名称：{product[0]}商品单价：{product[1]}库存数量：{product[2]}")


#主函数

if __name__=="__main__":
    import random
    from datetime import datetime

    cart=[]#初始化一个空的购物车列表
    #存储要买的物品信息,包括商品名称，欲购买数量
    wants=[['热水器',1],['电暖扇',3],['空调',2],['风扇',5],['洗衣机',2],['白醋',1], ['牛奶',5], ['洗发水',21], ['香蕉',2], ['鸡蛋',2], ['面包', 3], ['苹果', 2]];
    #存储商品信息,每个子列表分别存储[商品id,'商品名称',单价,库存数量]
    products=[['电暖扇',200,3],['空调',2500,4],['白醋',8,20],['苹果',5,50],['牛奶',5,50],['面包',15,50],['鸡蛋',5,30],['洗发水',20,2],['酱油',10,30],['热水器',2000,1],
              ['洗衣机',2000,3],['风扇',300,8]]


    #使用字典存储优惠券信息，抽取优惠券
    voucher_dict={1:'空调', 2:'洗衣机', 3:'风扇', 4:'洗发水', 5: '吹风机', 6: '洗发水', 7: '电饭煲', 8: '热水器', 9: '电暖扇', 10: '电视'}


    # 抽取优惠券
    voucher=get_voucher(voucher_dict)
    print(f"您抽中的优惠券是：{voucher}")
    #逐个添加购物车
    ch = ''
    left = 10000  # 初始化现金余额
    total=0#初始化总计金额为0
    #添加购物车
    for want in wants:

        if ch=='Q' or ch=='q':
            print("已退出购物")
            break
        else:
            left,total,cart,products = add_to_cart(want, left, products, cart,total,voucher)  # 添加的同时打印余额
            ch = input('输入Q/q退出购物:').strip().lower()
    #打印库存信息和购物车信息
    # show_cart(cart,voucher,total,left)
    # show_products(products)

    #退回到购物架 total:总消费 left:余额
    # 退货功能
    left ,total,cart,products= refund_product(left, total,products, cart, voucher)    #打印购物小条
    # 购物结束显示购物车信息
    show_cart(cart,voucher,total,left);
    #再确认一下库存信息是否更新正确
    # show_products(products)



